---
title: 'docker 指令'
date: '2023-08-12'
lastmod: '2023-10-03'
tags: ['docker']
# draft: false
summary: 'docker 的常用指令介绍'
# images: ['/static/images/twitter-card.png']
---


**目录**
- [创建容器](#创建容器)
- [进入容器](#进入容器)
- [容器拷贝](#容器拷贝)
- [清空本机docker环境](#清空本机docker环境)
- [常用命令](#常用命令)
- [重启容器](#重启容器)
- [修改容器端口](#修改容器端口)

#### 创建容器
   
   ```shell
   #我们直接启动命令， --net bridge，就是docker0（默认）
   docker run -d -P --name=nickName --net bridge tomcat
   
   docker run[OPTIONS]IMAGE[COMMAND][ARG...]
   参数【OPTIONS】说明：
   
   --name：为容器指定一个名称
   -d：后台运行容器并返回容器ID，也即启动守护式容器
   -i：以交互模式（interactive）运行容器，通常与-t同时使用
   -t：为容器重新分配一个伪输入终端（tty），通常与-i同时使用。也即启动交互式容器（前台有伪终端，等待交互）
   -e：为容器添加环境变量
   -P：随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
   -p：指定端口映射
   -p指定端口映射的几种不同形式：
   
   -p hostPort:containerPort：端口映射，例如-p 8080:80
   -p ip:hostPort:containerPort：配置监听地址，例如 -p 10.0.0.1:8080:80
   -p ip::containerPort：随机分配端口，例如 -p 10.0.0.1::80
   -p hostPort1:containerPort1-p hostPort2:containerPort2：指定多个端口映射，例如-p 8080:8
   0 -p 8888:3306
   
   #docker0特点：默认，域名不能访问，--link不建议使用
   
   下面我们自己来创建一个bridge。
   
   docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 testnet
   
   docekr network ls
   ```

> docker network inspect 网卡名字  #查看网卡详细信息

```shell
  docker run -d -P --name=nickName01 --net=testnet tomcat:7
  docker run -d -P --name=nickName02 --net testnet tomcat:7
```

```shell
  docker exec -it nickName01 ping -c 3 IP
  docker exec -it nickName02 ping -c 3 nickName02
    #提示，ping -c可以自定义ping的次数
```

#### 进入容器
```shell
# 进入容器并交互可以操作  进入容器终端
docker exec -it nickName /bin/bash
# 进入容器并且在退出的时候删除
docker run -it --rm tomcat:9.0
# 进入容器
docker attach nickName
docker attach containerId

# 进入容器不交互，可以操作执行容器内的命令
docker exec -it nickName cat /etc/hosts


```

#### 容器拷贝
```shell
# 拷贝文件到容器
docker cp 本地文件 容器ID:容器内路径

# 拷贝文件到本地
docker cp 容器ID:容器内路径 本地路径
```


#### 清空本机docker环境
   
```shell
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)    # 清空包含正在运行的镜像
```
[⬆ 回顶部](#)

#### 常用命令   

- [ 查看版本] `docker version`
* [ 查看Docker概要信息] `docker info`
* [ 查看Docker总体帮助文档] `docker--help`
* [ 查看docker具体命令帮助文档] `docker具体命令--help`
* [ 启动Docker] `systemctl start docker`
* [ 停止Docker] `systemctl stop docker`
* [ 重启Docker] `systemctl restart docker`
* [ 查看状态] `systemctl status docker`
* [ 开机启动] `systemctl enable docker`
* [ 查看所有镜像 ] `docker images`
  * -a：列出所有镜像（含历史镜像）
  * -q：只显示镜像ID
  * -f：过滤
* [ 搜索镜像 ] `docker search 镜像名称`
  * -f：过滤 
  * --limit  数量：只列出N个镜像，默认25个
- [ 查看镜像/容器/数据卷所占的空间 ] docker system df
- [ 删除镜像 ] docker rmi  镜像1 镜像2 镜像3
- [ 删除全部镜像 ] `docker rmi -f ${docker images -qa}`
- [ 列出运行的所有容器 ] `docker ps [option]`
  - -a：列出当前所有正在运行的容器+历史上运行过的  
  - -l：显示最近创建的容器。-n：显示最近n个创建的容器。-q：静默模式，只显示容器编号。
- [ 查看容器列表] `docker container ls [option]`
  - -a：显示所有容器，包括已停止的容器
  - -l：显示最近创建的容器
  - -n：显示最近n个创建的容器
- [ 启动已停止运行的容器] `docker start 容器ID或者容器名`
- [ 重启容器] `docker restart 容器ID或容器名`
- [ 停止容器] `docker stop 容器ID或容器名`
* [ 强制停止容器] `docker kill 容器ID或容器名`
* [ 删除已经停止的容器] `docker rm 容器ID或容器名`
* [ 强制删除正在运行的容器] `docker rm -f 容器ID或容器名`
* [ 一次删除多个容器实例] `docker rm -f ${docker ps-a-q}` 或者 `docker ps-a-q|xargs docker rm`

- attach：将本地的标准输入、输出和错误流附加到正在运行的容器，允许你实时查看容器内的运行输出，并与容器进行交互。  
  - `docker attach 容器ID` 
- commit：从容器的更改创建一个新的镜像，通常在你对容器进行了一些配置更改后，想将这些更改保存为一个新的镜像时使用。
  - `docker commit 容器ID 新镜像名:版本号`  
  - `docker commit -m "提交的说明" -a "作者" 容器ID 新镜像名:版本号` 和git提交类似
- [ 退出容器 ] `exit`
- top：显示容器内正在运行的进程，类似于在宿主机上使用top命令查看进程信息，有助于了解容器内应用程序的运行状态。
  - `docker top 容器ID`
- wait：阻塞直到一个或多个容器停止，然后打印它们的退出代码，可用于脚本中等待容器完成任务后再执行后续操作。
  - `docker wait 容器ID`
- update：更新一个或多个容器的配置，例如更新容器的资源限制、重启策略等，而无需重新创建容器。
  - `docker update 容器ID`
- stats：显示一个或多个容器的实时资源使用统计信息，如 CPU 使用率、内存使用量、网络带宽等，用于监控容器的性能。
  - `docker stats` 所有容器统计信息
  - `docker stats 容器ID`
- save：将一个或多个镜像保存为一个 tar 归档文件（默认输出到标准输出），可用于备份镜像或在不同环境间传输镜像。
  - `docker save 镜像ID > 导出文件名`
- rename：重命名一个容器，便于更好地识别和管理容器。
  - `docker rename 原容器ID 新容器ID`
- load：从 tar 归档文件或标准输入加载一个镜像，常用于从离线存储或其他地方导入镜像。
  - `docker load < 镜像文件.tar>`
- inspect：查看容器的详细信息，包括配置、状态、网络等。
  - `docker inspect 容器ID`
- history：查看容器的历史记录，包括构建镜像的命令和步骤。
  - `docker history 容器ID`
- export：将容器的文件系统导出为一个 tar 归档文件，便于备份或在其他地方导入。
  - `docker export 容器ID > 导出文件名` 
- import：从一个 tar 归档文件中导入镜像，通常用于将备份的镜像导入到本地。
  - `docker import 导入文件名 镜像名:版本号`
- logs：查看容器的日志输出，通常用于调试和查看容器的运行状态。
  - `docker logs 容器ID`
- pause：暂停一个或多个正在运行的容器，使其暂时停止运行，但不停止容器本身。
  - `docker pause 容器ID`
- port：查看容器的端口映射情况，显示容器内部端口与宿主机端口的映射关系。
  - `docker port 容器ID 容器内部端口`
- events：从 Docker 服务器获取实时事件，例如容器的启动、停止、镜像的拉取等事件，可用于监控 Docker 环境的动态变化。
  - `docker events`
- diff：检查容器文件系统上文件或目录的更改，帮助你了解容器内文件系统的变动情况。
  - `docker diff 容器ID`
- create：创建一个新的容器，但不启动它，你可以在创建时指定容器的各种配置，如挂载卷、暴露端口等。
  - `docker create 镜像ID或镜像名`

<br/>   

**命令组合**

- [ 启动容器] `docker run 镜像ID或镜像名`
  - `docker run --name sentry --restart always --v $SENTRY_HOME/config:/etc/sentry --v $SENTRY_HOME/logs:/var/log/sentry --v $SENTRY_HOME/data:/var/opt/sentry sentry`
* [ 进入容器] `docker exec 容器ID或容器名 /bin/bash`
- [从dockerfile构建一个镜像] `docker build -t 镜像名:版本号 .`
  - `-t`：指定镜像的名称和版本号。
  - `.`：表示 Dockerfile 文件所在的当前目录。
- [拉取镜像] `docker pull 镜像名:版本号`
- [推送镜像] `docker push 镜像名:版本号`
- [查看镜像] `docker images`
- [搜索镜像] `docker search 镜像名`

**管理命令**
- builder：管理构建相关操作，例如管理构建缓存、构建器实例等，有助于优化构建过程和管理构建环境。
- buildx：Docker Buildx 是一个构建工具，它扩展了docker build的功能，支持多平台构建等高级特性，让你能够为不同的操作系统和架构构建镜像。
- compose：Docker Compose 用于定义和运行多容器的 Docker 应用程序。通过一个docker - compose.yml文件，你可以配置应用程序的各个服务，然后使用一条命令启动、停止或管理整个应用栈。
- container：用于管理容器，涵盖了创建、启动、停止、删除容器等一系列操作，是容器管理的核心命令组。
- context：管理 Docker 上下文，允许你轻松切换不同的 Docker 环境，比如从本地开发环境切换到远程生产环境，每个上下文可以有不同的 Docker 守护进程连接配置。
- image：管理镜像，包括拉取、推送、标记、删除镜像等操作，是镜像管理的主要命令集合。
- manifest：用于管理 Docker 镜像清单和清单列表，特别是在处理多平台镜像时非常有用，可以将不同平台的镜像组合成一个清单列表，方便分发和使用。
- network：管理 Docker 网络，你可以创建、删除、查看网络，以及将容器连接到不同的网络，实现容器间的网络隔离和通信。
- plugin：管理 Docker 插件，包括安装、卸载、启用和禁用插件，扩展 Docker 的功能。
- trust：管理 Docker 镜像的信任，例如管理镜像签名，确保拉取和使用的镜像来源可靠且未被篡改。
- volume：管理 Docker 卷，用于在容器和宿主机之间持久化数据，包括创建、删除、查看卷，以及将卷挂载到容器中。

**全局命令**
- --config string：指定客户端配置文件的位置，默认位于/root/.docker，配置文件包含了 Docker 客户端的一些设置，如认证信息等。
- -c, --context string：指定用于连接 Docker 守护进程的上下文名称，这会覆盖DOCKER_HOST环境变量和通过docker context use设置的默认上下文。
- -D, --debug：启用调试模式，在调试 Docker 相关问题时，该选项会输出更多详细的日志信息，帮助定位问题。
- -H, --host list：指定要连接的 Docker 守护进程的套接字地址，例如-H tcp://192.168.1.100:2376可以连接到指定 IP 和端口的 Docker 守护进程。
- -l, --log - level string：设置日志级别，可选值为debug（调试）、info（信息）、warn（警告）、error（错误）、fatal（严重错误），默认是info，通过调整日志级别可以控制输出的日志详细程度。
- --tls：启用 TLS 连接，通过该选项可以使用安全的 HTTPS 连接与 Docker 守护进程通信，确保数据传输的安全性。当使用--tlsverify时，该选项会被隐含启用。
- --tlscacert string：指定仅信任由该 CA 签名的证书，默认路径是/root/.docker/ca.pem，用于验证 Docker 守护进程的证书。
- --tlscert string：指定 TLS 证书文件的路径，默认是/root/.docker/cert.pem，用于客户端向 Docker 守护进程进行身份验证。
- --tlskey string：指定 TLS 密钥文件的路径，默认是/root/.docker/key.pem，配合证书文件使用，用于客户端身份验证。
- --tlsverify：使用 TLS 并验证远程 Docker 守护进程的证书，确保连接的安全性。





[⬆ 回顶部](#)



#### 重启容器

```shell
# 无论容器是因为什么原因退出（正常退出或异常退出），Docker 都会自动重新启动该容器。而且在主机重启后，容器也会自动启动。
docker run -d --restart=always --name my_container my_image

# 容器会在主机重启后自动启动，并且只要不是被手动停止（docker stop命令），容器就会一直保持运行状态。如果容器因为其他原因（如错误、信号等）退出，Docker 会自动重新启动它。
docker run -d --restart=unless - stopped --name my_container my_image
# 以非零退出码退出（即容器因为错误而退出）时重新启动容器，并且在主机重启后也会根据退出码情况来决定是否重新启动。可以指定一个最大重启次数。
docker run -d --restart=on - failure:3 --name my_container my_image

```
**方式二、创建文件**  `/etc/systemd/system/my_container.service`
```shell
[Unit]
Description=My Docker Container Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
Removing=yes
ExecStart=/usr/bin/docker start -a my_container
ExecStop=/usr/bin/docker stop -t 2 my_container
[Install]
WantedBy=multi - user.target

```
- [Unit]部分：
  - Description是对服务的简单描述。
  - Requires和After表示这个服务依赖于 Docker 服务，并且在 Docker 服务启动之后才会启动。
- [Service]部分：
  - Type = oneshot表示这是一个一次性的服务（虽然在启动和停止容器的过程中可能会执行多次操作，但整体上看作一次性服务）。
  - Removing = yes表示在服务停止后，如果容器没有被其他服务使用，就将其删除（这可以根据实际需求调整）。
  - ExecStart指定了启动容器的命令，-a参数用于将容器的标准输出和标准错误输出附加到当前终端（如果需要查看容器的输出可以这样设置）。
  - ExecStop指定了停止容器的命令，-t 2表示在停止容器时等待 2 秒，给容器足够的时间来优雅地停止。
- [Install]部分：
  - WantedBy = multi - user.target表示这个服务应该在多用户模式下启动。

重新加载 systemd 配置

```shell
systemctl daemon-reload
systemctl enable my_container.service
```

**方式三、删除容器**   
这不会删除容器挂载的数据卷，前提是你之前使用了数据卷挂载
然后按照之前的配置重新启动容器

[⬆ 回顶部](#)






#### 修改容器端口
方式一：commit 方式拷贝运行，删除旧容器,和方式二换汤不换药

```shell
docker commit [options] my_container my_new_image
# 查看镜像
docker images
# 删除旧容器
docker rm my_container
# 重新运行
docker run -d -p 9000:9000 --name my_container my_new_image

```

方式二：删除容器，重新运行，配置要重新输入   
要求是容器是挂卷的，也就是文件外挂载的方式
```shell
docker stop my_container
docker rm my_container
# 但是之前的配置要重新配置一下
docker run -d -p 9000:9000 --name my_container my_image
```
方式三：修改配置文件，重启容器（不推荐）
```shell
systemctl stop docker
nano /var/lib/docker/container/<container_id>/hostconfig.json

{
  ...
  "NetworkMode": "bridge",
	"PortBindings": {
		"9000/tcp": [{  # 主机端口映射
			"HostIp":"",
			"HostPort":"9000" # 映射容器端口
		}],
	},
  ...
}

# 重启docker
systemctl start docker
docker restart <container_id>
```